<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>let与const</title>
</head>
<body>
    <script>
        //用var定义的变量
        // var x=6;
        // console.log(x);
        // {
        //     var x=3;
        //     console.log(x);
        // }
        // console.log(x);

        // var y=6;
        // console.log(y);
        // {
        //     let y=3;     //let在相同的作用域内，不能重复声明同一个变量
        //     console.log(y);  //let代码只在let命令所在的代码块{}内有效
        // }
        // console.log(y);
        
        //let不能在同一个作用域下重复声明变量
        //意思就是在一个作用域内用let声明一个变量，就不能再次声明这个变量，var的话可以重复声明
        // function func(){
        //     let i=4;
        //     // var i=1;//报错：Identifier 'i' has already been declared  
        //     console.log(i);
        // }
        // func();

        //块级作用域
        // var a =1000;
        // function f(){
        //     //函数体内相当于块级作用域，由于变量的提升，导致内层的a变量覆盖了外面的a变量，
        //     console.log(a);//打印出undefined，作用域内a变量没有定义，相当于是空的。
        //     if(false)
        //     {
        //         var a='ni hao';//if判断语句为false，在此不执行if的判断语句。
        //     }
        // }
        // f();//调用函数

            // 计数的循环变量泄露为全局变量
            // var str ="welcome";
            // for(var i=0;i<str.length;i++)//i控制循环，循环结束，不会消失，可以继续使用，泄露成全局变量。
            //                             //与java的for不一样，java for循环生明变量，仅限于循环
            // {
            //     console.log(str[i]);//字符串的读取打印取字母
            // }
            // console.log(i);//打印泄露的全局变量i，查看i是否消失了。

            // // 2.5 块级作用域
            // function fun(){
            //     let n="a";
            //     if(true)
            //     {
            //         let n='b';//let命令旨在块级作用域内有效，内层不影响外层
            //         console.log(n);//在if作用域下打印出来的为b
            //     }
            //     console.log(n);//使用if的外层作用域let n="a" ，从而打印出的n=a；
            // }
            // fun();


            // 2.13 const命令
                //const命令一旦声明，他的值就无法改变
            //     const pi=3.1415926;//const一旦声明常量，就得初始化，不可以先声明，留到以后赋值！！！
            //     console.log(pi);
            //     pi=3.14;
            //     console.log("改变pi的值后发生的情况",pi);//报错：Assignment to constant variable.

            // //例题2.7 使用const声明常量初始化。
            //     const foo;//直接报错，不运行就报错了已经，浏览器报错：在常量声明没有初始化。
            //     foo=100;
            //     console.log(foo);

            if(true){
                const Max=5;//const在块级作用域下声明，只在块级作用域下有效，与let命令相同
            }
            console.log(Max);//报错：Max is not defined 
            
</script>
</body>
</html>